#pragma once
//#ifndef _STRING_H_
//#define _STRING_H_

#include <iostream>

#include <string>
using namespace std;
/*
 * Clase que permite trabajar con cadenas de caracteres que contienen
 * dentro al caracter '\0'.Tiene casi todos los metodos de string
 *
 **/
class String
{
  private:
    char* _cadena;
    size_t _size;

  public:

    String ();
    String ( const String& str );
    String( const string& );

    /*
     * Si el caracter '\0' no define el fin de la cadena, es necesario
     * pasar el tamaño de la misma por parámetro.
     **/
    String ( const char * s , size_t size );

    /*
     * Se usa cuando se tiene una cadena terminada en '\0'
     **/
    String ( const char * s );

    size_t size() const;
    void resize ( size_t n, char c );

    String& operator= ( const String& str );
    String& operator= ( char c );
    String& operator= ( const string& cadena );
    String& operator= ( const char* cadena );

    String& operator+= ( const String& str );
    String& operator+= ( char c );

    bool operator== ( const String& );

    int comparar(const String& str);
    String substr ( size_t pos , size_t n  ) const;

    /*
     * Transforma el String en un string común.Es necesario pasar el size
     * del string que se quiere obtener.Dentro del string no devuelto
     * no debe haber caracteres '\0' intermedios.
     **/

    string tostring( size_t size );

	 string tostring();

    /*Devuelve la cadena de caracteres _cadena */
    char* toChar();

    const char& operator[] ( size_t pos ) const;
    char& operator[] ( size_t pos );

    ~String();

    /*
     * Carga el stream con 'size' bytes consecutivos tomados del istream.
     * Se borra el contenido previo del String.
     * Retorna true si los pudo leer todos, false si no.
     **/

    bool read( istream& stream, size_t size );

    friend ostream& operator<< ( ostream&, const String& );

};

//#endif
